/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.prot.gui;
import org.apache.log4j.Logger;
import java.awt.event.ItemEvent;
import java.util.Enumeration;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
/**
* Configuration GUI-Panel for RXTX Serial port object
*
* @author erwin
*/
public class SerialConfigPanel
extends javax.swing.JPanel
{
private static final long serialVersionUID = -8518189691304679418L;
/** allow direct port changes from dialog changes? */
public static boolean doPortUpdates = true;
/** ist the dialog initialized? */
boolean initialized = false;
/** Creates new form SerialConfigPanel */
public SerialConfigPanel()
{
initComponents();
initPortNames();
}
/** Creates new form SerialConfigPanel */
public SerialConfigPanel(SerialPort serPort)
{
initComponents();
initPortNames();
setPort(serPort);
}
/**
* initialize list of available port names for combo box
*/
public void initPortNames()
{
initialized = false;
cbPort.addItem("");
// initialize port selection
CommPortIdentifier currPort;
Enumeration ports = CommPortIdentifier.getPortIdentifiers();
while (ports.hasMoreElements())
{
currPort = (CommPortIdentifier) ports.nextElement();
if (currPort.getPortType() == CommPortIdentifier.PORT_SERIAL)
{
cbPort.addItem(currPort.getName());
}
}
initialized = true;
}
/**
* Initialize all port parameters PORT -> DIALOG
*/
public void initPortParameters(SerialPort port)
{
initialized = false;
if (port != null)
{
cbPort.setSelectedItem(port.getName());
cbBaudrate.setSelectedItem(String.valueOf(port.getBaudRate()));
cbParity.setSelectedIndex(port.getParity());
cbDataBits.setSelectedIndex(port.getDataBits() - 5);
cbStopBits.setSelectedIndex(port.getStopBits() - 1);
// flow control combo's
int prt = port.getFlowControlMode();
cbProtocolRx.setSelectedIndex((prt & SerialPort.FLOWCONTROL_RTSCTS_IN) != 0 ? 1 : (prt & SerialPort.FLOWCONTROL_XONXOFF_IN) != 0 ? 2 : 0);
cbProtocolTx.setSelectedIndex((prt & SerialPort.FLOWCONTROL_RTSCTS_OUT) != 0 ? 1 : (prt & SerialPort.FLOWCONTROL_XONXOFF_OUT) != 0 ? 2 : 0);
btnDSR.setSelected(port.isDSR());
btnCTS.setSelected(port.isCTS());
btnCD.setSelected(port.isCD());
btnDTR.setSelected(port.isDTR());
btnRTS.setSelected(port.isRTS());
}
initialized = true;
}
/**
* Initialize all port parameters DIALOG -> PORT
*/
public void updatePortParameters(SerialPort port)
{
if (initialized && port != null)
{
try
{
port.setSerialPortParams(Integer.valueOf(cbBaudrate.getSelectedItem().toString()).intValue(),
cbDataBits.getSelectedIndex() + 5,
cbStopBits.getSelectedIndex() + 1,
cbParity.getSelectedIndex());
// flow control parameters
int mode = 0;
mode |= (cbProtocolRx.getSelectedIndex() == 1) ? SerialPort.FLOWCONTROL_RTSCTS_IN : (cbProtocolRx.getSelectedIndex() == 2) ? SerialPort.FLOWCONTROL_XONXOFF_IN : 0;
mode |= (cbProtocolTx.getSelectedIndex() == 1) ? SerialPort.FLOWCONTROL_RTSCTS_OUT : (cbProtocolTx.getSelectedIndex() == 2) ? SerialPort.FLOWCONTROL_XONXOFF_OUT : 0;
port.setFlowControlMode(mode);
} catch (Exception ex)
{
ex.printStackTrace();
}
}
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents()
{
java.awt.GridBagConstraints gridBagConstraints;
panData = new javax.swing.JPanel();
lblPort = new javax.swing.JLabel();
cbPort = new javax.swing.JComboBox();
lblBaudrate = new javax.swing.JLabel();
cbBaudrate = new javax.swing.JComboBox();
lblDataBits = new javax.swing.JLabel();
cbDataBits = new javax.swing.JComboBox();
lblStopBits = new javax.swing.JLabel();
cbStopBits = new javax.swing.JComboBox();
lblParity = new javax.swing.JLabel();
cbParity = new javax.swing.JComboBox();
lblHsRx = new javax.swing.JLabel();
lblHsTx = new javax.swing.JLabel();
cbProtocolRx = new javax.swing.JComboBox();
cbProtocolTx = new javax.swing.JComboBox();
jPanel1 = new javax.swing.JPanel();
btnDSR = new javax.swing.JToggleButton();
btnCTS = new javax.swing.JToggleButton();
btnCD = new javax.swing.JToggleButton();
btnDTR = new javax.swing.JToggleButton();
btnRTS = new javax.swing.JToggleButton();
setLayout(new java.awt.BorderLayout());
panData.setLayout(new java.awt.GridBagLayout());
lblPort.setFont(new java.awt.Font("Dialog", 0, 10));
lblPort.setLabelFor(cbPort);
lblPort.setText("Port");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
panData.add(lblPort, gridBagConstraints);
cbPort.setFont(new java.awt.Font("Dialog", 0, 10));
cbPort.addItemListener(new java.awt.event.ItemListener()
{
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
cbPortItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
panData.add(cbPort, gridBagConstraints);
lblBaudrate.setFont(new java.awt.Font("Dialog", 0, 10));
lblBaudrate.setLabelFor(cbBaudrate);
lblBaudrate.setText("Baudrate");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
panData.add(lblBaudrate, gridBagConstraints);
cbBaudrate.setEditable(true);
cbBaudrate.setFont(new java.awt.Font("Dialog", 0, 10));
cbBaudrate.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"300", "600", "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200"}));
cbBaudrate.setSelectedIndex(5);
cbBaudrate.addItemListener(new java.awt.event.ItemListener()
{
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
SelectionChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
panData.add(cbBaudrate, gridBagConstraints);
lblDataBits.setFont(new java.awt.Font("Dialog", 0, 10));
lblDataBits.setLabelFor(cbDataBits);
lblDataBits.setText("Data Bits");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
panData.add(lblDataBits, gridBagConstraints);
cbDataBits.setFont(new java.awt.Font("Dialog", 0, 10));
cbDataBits.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"5", "6", "7", "8"}));
cbDataBits.setSelectedIndex(3);
cbDataBits.addItemListener(new java.awt.event.ItemListener()
{
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
SelectionChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
panData.add(cbDataBits, gridBagConstraints);
lblStopBits.setFont(new java.awt.Font("Dialog", 0, 10));
lblStopBits.setLabelFor(cbStopBits);
lblStopBits.setText("Stop Bits");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
panData.add(lblStopBits, gridBagConstraints);
cbStopBits.setFont(new java.awt.Font("Dialog", 0, 10));
cbStopBits.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"1", "2", "1.5"}));
cbStopBits.addItemListener(new java.awt.event.ItemListener()
{
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
SelectionChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
panData.add(cbStopBits, gridBagConstraints);
lblParity.setFont(new java.awt.Font("Dialog", 0, 10));
lblParity.setLabelFor(cbParity);
lblParity.setText("Parity");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
panData.add(lblParity, gridBagConstraints);
cbParity.setFont(new java.awt.Font("Dialog", 0, 10));
cbParity.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"None", "Odd", "Even", "Mark", "Space"}));
cbParity.addItemListener(new java.awt.event.ItemListener()
{
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
SelectionChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
panData.add(cbParity, gridBagConstraints);
lblHsRx.setFont(new java.awt.Font("Dialog", 0, 10));
lblHsRx.setText("Handshake Rx");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
panData.add(lblHsRx, gridBagConstraints);
lblHsTx.setFont(new java.awt.Font("Dialog", 0, 10));
lblHsTx.setText("Handshake Tx");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 6;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
panData.add(lblHsTx, gridBagConstraints);
cbProtocolRx.setFont(new java.awt.Font("Dialog", 0, 10));
cbProtocolRx.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"None", "RTS/CTS", "XON/XOFF"}));
cbProtocolRx.addItemListener(new java.awt.event.ItemListener()
{
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
SelectionChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
panData.add(cbProtocolRx, gridBagConstraints);
cbProtocolTx.setFont(new java.awt.Font("Dialog", 0, 10));
cbProtocolTx.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"None", "RTS/CTS", "XON/XOFF"}));
cbProtocolTx.addItemListener(new java.awt.event.ItemListener()
{
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
SelectionChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 6;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
panData.add(cbProtocolTx, gridBagConstraints);
add(panData, java.awt.BorderLayout.CENTER);
jPanel1.setLayout(new java.awt.GridLayout(1, 0, 1, 0));
btnDSR.setFont(new java.awt.Font("Dialog", 0, 8));
btnDSR.setText("DSR");
btnDSR.setEnabled(false);
btnDSR.setOpaque(false);
jPanel1.add(btnDSR);
btnCTS.setFont(new java.awt.Font("Dialog", 0, 8));
btnCTS.setText("CTS");
btnCTS.setEnabled(false);
btnCTS.setOpaque(false);
jPanel1.add(btnCTS);
btnCD.setFont(new java.awt.Font("Dialog", 0, 8));
btnCD.setText("CD");
btnCD.setEnabled(false);
btnCD.setOpaque(false);
jPanel1.add(btnCD);
btnDTR.setFont(new java.awt.Font("Dialog", 0, 8));
btnDTR.setText("DTR");
btnDTR.setEnabled(false);
btnDTR.setOpaque(false);
jPanel1.add(btnDTR);
btnRTS.setFont(new java.awt.Font("Dialog", 0, 8));
btnRTS.setText("RTS");
btnRTS.setEnabled(false);
btnRTS.setOpaque(false);
jPanel1.add(btnRTS);
add(jPanel1, java.awt.BorderLayout.SOUTH);
}// </editor-fold>//GEN-END:initComponents
private void SelectionChanged(java.awt.event.ItemEvent evt)//GEN-FIRST:event_SelectionChanged
{//GEN-HEADEREND:event_SelectionChanged
if (doPortUpdates && evt.getStateChange() == ItemEvent.SELECTED)
{
updatePortParameters(port);
}
}//GEN-LAST:event_SelectionChanged
private void cbPortItemStateChanged(java.awt.event.ItemEvent evt)//GEN-FIRST:event_cbPortItemStateChanged
{//GEN-HEADEREND:event_cbPortItemStateChanged
// the port has been changed -> select thew new port
if (initialized && evt.getStateChange() == ItemEvent.SELECTED)
{
String portName = String.valueOf(evt.getItem());
SerialPort newPort;
try
{
newPort = (SerialPort) CommPortIdentifier.getPortIdentifier(portName).open(portName, 1000);
} catch (Exception e)
{
newPort = null;
Logger.getLogger(getClass()).warn(e.getMessage());
}
setPort(newPort);
}
}//GEN-LAST:event_cbPortItemStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JToggleButton btnCD;
private javax.swing.JToggleButton btnCTS;
private javax.swing.JToggleButton btnDSR;
private javax.swing.JToggleButton btnDTR;
private javax.swing.JToggleButton btnRTS;
private javax.swing.JComboBox cbBaudrate;
private javax.swing.JComboBox cbDataBits;
private javax.swing.JComboBox cbParity;
private javax.swing.JComboBox cbPort;
private javax.swing.JComboBox cbProtocolRx;
private javax.swing.JComboBox cbProtocolTx;
private javax.swing.JComboBox cbStopBits;
private javax.swing.JPanel jPanel1;
private javax.swing.JLabel lblBaudrate;
private javax.swing.JLabel lblDataBits;
private javax.swing.JLabel lblHsRx;
private javax.swing.JLabel lblHsTx;
private javax.swing.JLabel lblParity;
private javax.swing.JLabel lblPort;
private javax.swing.JLabel lblStopBits;
private javax.swing.JPanel panData;
// End of variables declaration//GEN-END:variables
/**
* Holds value of property port.
*/
private SerialPort port;
/**
* Getter for property device.
*
* @return Value of property device.
*/
public SerialPort getPort()
{
return this.port;
}
/**
* Setter for serial Port.
*
* @param port New value of port.
*/
public void setPort(SerialPort port)
{
if (this.port != null)
{
this.port.removeEventListener();
}
this.port = port;
initPortParameters(port);
}
}